#ifndef hal_tlv_H
#define hal_tlv_H

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "tlv_pack_com.h"

#define ENDIANSWAP_DATA(AHD) endianSwap(&(AHD), sizeof(AHD))

static __inline__ int isLittleEndian()
{
    //大端模式返回0
    int test = 1;
    return (*(char *)&test);
}

static __inline__ void endianSwap(void *data, size_t size)
{
    char *bytes = (char *)data;
    size_t i, j;
    char temp;

    for (i = 0, j = size - 1; i < j; i++, j--)
    {
        temp     = bytes[i];
        bytes[i] = bytes[j];
        bytes[j] = temp;
    }
}

// 队列最大接受数据包数量
#define Queue_MAX_SIZE 20

// 队列结构体
struct PacketQueue
{
    int front;
    int rear;
    uint8_t itemcount;
    struct TLVPacket items[Queue_MAX_SIZE];
};

// 指令表最大指令集长度
#define CMDMAPTYPEST_MAX_LEN 50

struct MessageTypeSt
{
    int FuncId;           // 功能命令TAG
    int StructTypeLength; // 主要用来看类型,对应的接口所对应的结构体类型和长度
};

//接口命令映射表
struct CmdMapTypeSt
{
    char *TopicName;
    uint8_t Module;
    struct MessageTypeSt MessageType[CMDMAPTYPEST_MAX_LEN];
};

#endif
